From: Joan Torres Lopez Date: Tue, 5 May 2026 15:28:18 +0000 (+0200) Subject: authPrompt: Await wiggle via show-message promise resolver X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~10^2^2~5 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=acde5807bb3e4c9f5df793ccfb46a3209e9ecbb0;p=gnome-shell.git authPrompt: Await wiggle via show-message promise resolver Pass promise resolver through the show-message signal so the message queue waits for the wiggle animation to finish before scheduling the next message timeout. This replaces the previous approach of manually increasing the timeout duration to account for the wiggle. Part-of: --- diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js index e186f8ca1..c01c6fe2e 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -478,21 +478,18 @@ export const AuthPrompt = GObject.registerClass({ this.reset(); } - _onShowMessage(_userVerifier, serviceName, message, type) { + _onShowMessage(_userVerifier, serviceName, message, type, showMessageResolver) { this.setMessage(message, type); this.emit('prompted'); - if (type === GdmUtil.MessageType.ERROR && - this._userVerifier.serviceIsFingerprint(serviceName)) { - // TODO: Use Await for wiggle to be over before unfreezing the user verifier queue - const wiggleParameters = { - duration: 65, - wiggleCount: 3, - }; - this._userVerifier.increaseCurrentMessageTimeout( - wiggleParameters.duration * (wiggleParameters.wiggleCount + 2)); - wiggle(this._message, wiggleParameters); - } + const shouldWiggle = type === GdmUtil.MessageType.ERROR && + this._userVerifier.serviceIsFingerprint(serviceName); + + const wigglePromise = shouldWiggle + ? wiggle(this._message, {duration: 65, wiggleCount: 3}) + : Promise.resolve(); + + showMessageResolver?.(wigglePromise); } _onVerificationFailed(userVerifier, serviceName, canRetry) { diff --git a/js/gdm/util.js b/js/gdm/util.js index d7339c140..eebbc8e24 100644 --- a/js/gdm/util.js +++ b/js/gdm/util.js @@ -262,11 +262,6 @@ export class ShellUserVerifier extends Signals.EventEmitter { this.emit('no-more-messages'); } - increaseCurrentMessageTimeout(interval) { - if (!this._messageQueueTimeoutId && interval > 0) - this._currentMessageExtraInterval = interval; - } - _serviceHasPendingMessages(serviceName) { return this._messageQueue.some(m => m.serviceName === serviceName); } @@ -279,17 +274,23 @@ export class ShellUserVerifier extends Signals.EventEmitter { this._queuePriorityMessage(serviceName, null, messageType); } - _queueMessageTimeout() { - if (this._messageQueueTimeoutId !== 0) + async _queueMessageTimeout() { + if (this._messageQueueTimeoutId !== 0 || this._showMessageResolver) return; const message = this.currentMessage; + const {promise, resolve} = Promise.withResolvers(); + this._showMessageResolver = resolve; - delete this._currentMessageExtraInterval; - this.emit('show-message', message.serviceName, message.text, message.type); + this.emit('show-message', message.serviceName, message.text, message.type, this._showMessageResolver); + + await promise.catch(logError); + if (!this._showMessageResolver) + return; + this._showMessageResolver = null; this._messageQueueTimeoutId = GLib.timeout_add_once(GLib.PRIORITY_DEFAULT, - message.interval + (this._currentMessageExtraInterval | 0), () => { + message.interval, () => { this._messageQueueTimeoutId = 0; if (this._messageQueue.length > 1) { @@ -330,6 +331,12 @@ export class ShellUserVerifier extends Signals.EventEmitter { GLib.source_remove(this._messageQueueTimeoutId); this._messageQueueTimeoutId = 0; } + + if (this._showMessageResolver) { + this._showMessageResolver(); + this._showMessageResolver = null; + } + this.emit('show-message', null, null, MessageType.NONE); }